package br.edu.unifei.cct720.trabalho07.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import br.edu.unifei.cct720.trabalho07.model.ponto.Ponto;
import br.edu.unifei.cct720.trabalho07.model.ponto.PontoControle;


public class ArquivoDados extends File {

	// Declaracao das variaveis de instancia
	/** */
	private BufferedReader stream;

	/**
	 * 
	 * @param a
	 * @throws IllegalArgumentException
	 */
	public ArquivoDados(String a) throws IllegalArgumentException {
		super(a);
	}

	/**
	 * Metodo responsavel para abertura do arquivo para leitura
	 * 
	 * @return BufferedReader
	 * @throws IOException
	 */
	public BufferedReader abrirArquivo() throws IOException {
		this.stream = new BufferedReader(
				new FileReader(
						new File(this.getAbsolutePath())
				)
		);
		return this.stream;
	}

	/**
	 * Metodo responsavel por fechar o stream do arquivo
	 * 
	 * @return void
	 * @throws IOException, NullPointerException
	 */
	public void fecharArquivo() throws IOException, NullPointerException {
		this.stream.close();
		this.stream = null;
	}


	/**
	 * Metodo utilizado para verificacao
	 * status do stream do arquivo
	 * 
	 * @return boolean
	 */
	public boolean isFechado() {
		return (this.stream == null) ? true : false;
	}

	/**
	 * Metodo responsavel por verificar se o arquivo
	 * esta pronto para leitura
	 * 
	 * @return boolean
	 * @throws IOException
	 */
	protected boolean isReady() throws IOException {
		if(this.stream == null) {
			this.abrirArquivo();
		} 
		return true;
	}

	// Metodos getters e setters
	public List<PontoControle> getPontosControle() throws IOException {

		// Declaracao das variaveis locais
		String line = "";
		String[] tokens = null;
		int x, y = 0;
		List<PontoControle> pontos = null;

		/*
		 *  Inicializando a lista de pontos que
		 *  serao carregados do arquivo
		 */
		pontos = new ArrayList<PontoControle>();
		
		// Carregando os pontos presentes no arquivo
		if(this.isReady()) {
			while (this.stream.ready()) {
				line = this.stream.readLine().trim().replaceAll("\\s{2,}", " ");
				tokens = line.split(" ");

				x = Integer.parseInt(tokens[0]);
				y = Integer.parseInt(tokens[1]);

				if (x < 0 || y < 0)
					break;

				pontos.add(new PontoControle(x, y));
			}
		}
		return pontos;
	}
}
